package requetes;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Scanner;

import modele.Noeud;

/**
 * Cette classe sert simplement a reunir une liste de noeuds et une liste de
 * scores associes en sortie d'une requete
 * 
 */
public class ResultatRequete {
	private ArrayList<Noeud> listeNoeuds;
	private ArrayList<Double> listeScores;

	/**
	 * Constructeur
	 * 
	 * @param listeNoeuds
	 *            une liste de noeuds
	 * @param listeScores
	 *            la liste des scores associes
	 */
	public ResultatRequete(ArrayList<Noeud> listeNoeuds,
			ArrayList<Double> listeScores) {
		super();
		this.listeNoeuds = listeNoeuds;
		this.listeScores = listeScores;
	}

	/**
	 * Getter de la liste des noeuds
	 * 
	 * @return la liste des noeuds resultats de la requete
	 */
	public ArrayList<Noeud> getListeNoeuds() {
		return listeNoeuds;
	}

	/**
	 * Getter de la liste des scores
	 * 
	 * @return la liste des scores resultats de la requete
	 */
	public ArrayList<Double> getListeScores() {
		return listeScores;
	}

	/**
	 * Methode qui parse un fichier qrelXX.txt
	 * 
	 * @param filePath
	 *            : le chemin du fichier
	 */
	public static ArrayList<String> readResultsFromFile(String filePath) {
		Scanner scanner;
		String str = "";
		ArrayList<String> results = new ArrayList<String>();
		try {
			scanner = new Scanner(new FileReader(filePath));
			while (scanner.hasNextLine()) {
				str = scanner.nextLine();
				str = str.replaceAll("([A-Za-z0-9.\\[\\]/\t]*)(\t0$)", "");
				str = str.replaceAll("([A-Za-z0-9.\\[\\]/\t]*)(\t1$)", "$1");
				if (!str.equals("")) {
					results.add(str);
				}
			}
			scanner.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		return results;
	}

	public static Evaluation evaluer(ArrayList<String> nosResultats,
			String filePath) {
		ArrayList<String> resultatsAtrouver = readResultsFromFile(filePath);
		Evaluation eval = new Evaluation();
		double rappelSurUn = 0 ;
		double precisionSurUn = 0 ;
		
		for (String resCourant : nosResultats) {
			if (resultatsAtrouver.contains(resCourant)) // commun aux deux
			{
				eval.getCommonResults().add(resCourant);
			} else // on a trouve un resultat qui n'est pas dans les resultats a trouver
			{
				eval.getSuplResults().add(resCourant);
			}
		}

		for (String resCourant : resultatsAtrouver) {
			if (!nosResultats.contains(resCourant)) // commun aux deux
			{
				eval.getMissingResults().add(resCourant);
			}
		}

		rappelSurUn = (double)eval.getCommonResults().size() / (double)resultatsAtrouver.size() ;
		precisionSurUn = (double)eval.getCommonResults().size() / (double)nosResultats.size() ; 
		/*
		 * Remarque (a supprimer quand tu l'auras lu, et dis moi si t'es ok) :
		 * j'ai code la methode pour trouver le nombre total de noeud ==> getNombreNoeud() dans GetBdd
		 * Mais en fait, la precision c'est pas nb_doc_pertinents_sel / nb_total_noeud !!!
		 * C'est nb_doc_pertinents_sel / nb_total_noeud_selectionnes_par_nous, bref je m'etais plantee, et je sais pas ce que t'avais compris toi ?
		 * 
		 * meme remarque pour le rappel j'avais mis nosResultats.size() / resultatsAtrouver.size() mais en fait le numerateur n'est pas bon
		 * j'avais mis nb_doc_selected / nb_doc_pertinents alors que c'est nb_doc_pertinents_sel / nb_doc_pertinents
		 * bref j'etais fatiguee ...
		 */
		
		eval.setRappel(rappelSurUn*100); // passage en pourcentage
		eval.setPrecision(precisionSurUn*100); // passage en pourcentage

		return eval;
	}

	public static void testerEvaluer() {
		ArrayList<String> nosResultats = new ArrayList<String>();

		nosResultats.add("Collection/d039.xml	/BALADE[1]/RECIT[1]/SEC[4]/P[5]");
		nosResultats.add("Collection/d039.xml	/BALADE[1]/RECIT[1]/SEC[4]/P[6]");
		nosResultats.add("Collection/d039.xml	/BALADE[1]/RECIT[1]/SEC[5]/P[1]");
		nosResultats
				.add("Collection/d094.xml	/BALADE[1]/PRESENTATION[1]/DESCRIPTION[1]/P[9]");
		nosResultats
				.add("Collection/d094.xml	/BALADE[1]/PRESENTATION[1]/DESCRIPTION[1]/P[10]");
		nosResultats
				.add("Collection/d094.xml	/BALADE[1]/PRESENTATION[1]/DESCRIPTION[1]/P[11]");
		nosResultats.add("Collection/d094.xml	/BALADE[1]/RECIT[1]/SEC[4]/P[3]");
		nosResultats.add("Collection/d094.xml	/BALADE[1]/RECIT[1]/SEC[4]/P[4]");
		nosResultats.add("Collection/d094.xml	/BALADE[1]/RECIT[1]/SEC[4]/P[5]");

		Evaluation eval = evaluer(nosResultats,
				"ressources/Qrels/qrel01.txt");

		System.out.println("resultats communs");
		for (int i = 0; i < eval.getCommonResults().size(); i++) {
			System.out.println(eval.getCommonResults().get(i));
		}
		System.out.println("################## RESULTATS ##################");
		System.out.println("Rappel = " + eval.getRappel());
		System.out.println("Precision = " + eval.getPrecision());
		
	}

	public static void main(String[] args) {
		// readResultsFromFile("/home/coralie/5A/Recherche_Information/Qrels/qrel01.txt");
		testerEvaluer();
	}
}
